본문으로 건너뛰기

프로세스와 스레드

프로세스 개요

  • 실행중인 프로그램을 프로세스라고 한다. 프로그램을 메모리에 적재하고 실행하는 순간 해당 프로그램은 프로세스가 된다.
  • foreground process: 사용자가 보는 앞에서 실행되는 프로세스
  • background process: 사용자가 보지 못하는 뒤에서 실행되는 프로세스 → 유닉스 체계의 운영체제에서는 데몬이라고 부르고, 윈도우 운영체제에서는 서비스라고 부른다.
  • 프로세스들은 차례대로 돌아가며 한정된 시간만큼만 CPU를 이용한다. 해당 시간이 끝났음을 알리는 인터럽트가 발생하면 다른 프로세스가 실행된다.
  • 타이머 인터럽트: 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트
  • PCB(프로세스 제어 블록)
    • 프로세스와 관련된 정보를 저장하는 자료구조
    • 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다.
    • PCB는 커널 영역에 생성되며 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다.
    • PCB에 담기는 정보 : 프로세스ID, 레지스터 값, 프로세스 상태, CPU 스케줄링 정보, 메모리 관리 정보, 사용한 파일과 입출력장치 목록
  • Context Switching(문맥 교환)
    • 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 context이라고 한다.
    • 하나의 프로세스 context는 해당 프로세스의 PCB에 표현되어 있다.
    • 인터럽트가 발생하면 운영체제는 해당 프로세스의 PCB에 context를 백업한다. 그리고 뒤이어 실행할 프로세스의 context를 복구한다.
    • 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 context switching이라고 한다.
  • 사용자 영역에서의 프로세스는 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.
  • 코드 영역
    • 텍스트 영역이라고도 부른다.
    • 기계어로 이루어진 명령어가 저장된다.
    • CPU가 실행할 명령어가 담겨 있어 read-only 공간이다.
  • 데이터 영역
    • 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간 (ex. 전역 변수)
    • 코드 영역과 데이터 영역은 크기가 고정된 영역이다. (정적 할당 영역)
    • 반면 힙 영역과 스택 영역은 프로세스 실행 과정에서 크기가 변할 수 있는 영역이다. (동적 할당 영역)
  • 힙 영역
    • 프로그래머가 직접 할당할 수 있는 저장 공간
    • 언젠가는 해당 공간을 반환해야 한다.
    • 그렇지 않는다면 메모리 낭비가 발생한다. (메모리 누수, memory leak)
  • 스택 영역
    • 데이터를 일시적으로 저장하는 공간 (ex. 매개 변수, 지역 변수)

프로세스 상태와 게층 구조


프로세스가 가질 수 있는 대표적인 상태는 아래와 같다.

  1. 생성 상태 : 프로세스를 생성 중인 상태
  2. 준비 상태 : CPU를 할당받아 실행할 수 있지만 자신의 차례가 아니기에 기다리고 있는 상태
  3. 실행 상태 : CPU를 할당받아 실행 중인 상태
  4. 대기 상태 : 입출력장치의 작업을 기다리는 상태 (blocked 상태)
  5. 종료 상태 : 프로세스가 종료된 상태

프로세스는 실행 도중 시스템 콜을 통해 다른 프로세스를 생성할 수 있다.

부모 프로세스 : 새 프로세스를 생성한 프로세스

자식 프로세스 : 부모 프로세스에 의해 생성된 프로세스

프로세스 계층 구조

프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리한다. 이 과정을 트리 구조로 나타낸 것을 프로세스 계층 구조라 한다.

부모 프로세스를 통해 자식 프로세스들은 복제(fork)와 메모리 공간을 다른 프로그램으로 교체(exec) 한다.

스레드

스레드란 프로세스를 구성하는 실행의 흐름 단위, 프로세스를 구성하는 실행 단위이다.

  • 스레드라는 개념이 도입되면서 여러 명령어를 동시에 실행할 수 있게 되었다.
  • 스레드는 프로세스 내에서 스레드 ID, 프로그램 값을 비롯한 레지스터 값, 스택으로 구성된다. → 스레드마다 각기 다른 코드 실행 가능
  • 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다.

멀티 프로세스: 여러 프로세스를 동시에 실행하는 것

멀티 스레드: 여러 스레드로 프로세스를 동시에 실행하는 것

멀티 프로세스 + 싱글 스레드 vs 싱글 프로세스 + 멀티 스레드
  • 프로세스끼리는 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원으르 공유한다.
  • 멀티 프로세스: 하나의 프로세스가 문제 생겨도 다른 프로세스에는 지장이 적거나 없지만, 같은 프로그램을 실행하기 위해 메모리에 동일한 내용들이 중복해서 존재한다. → 낭비!!
  • 멀티스레드 : 자원을 공유하기 때문에 협력과 통신에 유리하지만 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.

프로세스끼리는 기본적으로 자원을 공유하지 않지만, 가능은 하다.

IPC(inter-process communication) : 프로세스 간 자원을 공유하고 데이터를 주고 받는 것